//@fract
//@version=6
indicator(title = 'Buying & Selling Pressure [Candle Metrics]', shorttitle = 'BSP', overlay = false, timeframe = '')

// Inputs {
typeMA = input.string(title = 'Averaging Type', defval = 'HMA', options = ['Gaussian 10 Polar', 'Linear Regression', 'HMA', 'RMA', 'EMA', 'WMA', 'SMA'], group = '')
ln = input.int(14, 'Period', 1)
bg = input.bool(true, 'Color Bars')
typeCM = input.string('Pressure', 'Range Type', ['Pressure', 'Net Move'], group = 'Bullish & Bearish Volatility', inline = 'bsp', display = display.none)
trsw = input.bool(false, 'Average True Range', group = 'ATR, Body Range')
brsw = input.bool(false, 'Average Body Range', group = 'ATR, Body Range')
awsw = input.bool(false, 'Average Wick Range', group = 'Wicks Range')
wksw = input.bool(false, 'Higher & Lower Wicks Range', group = 'Wicks Range')
twsw = input.bool(false, 'Total Wicks Range', group = 'Wicks Range')
//}
// Candle Metrics {
tr = ta.tr                                                                      //true_range
br = math.abs(close - open)                                                     //body_range
hw = high - math.max(open, close)                                               //higher_wick
lw = math.min(open, close) - low                                                //lower_wick
tw = high - low - br                                                            //total_wicks
aw = math.avg(hw, lw)                                                           //average_wick
bp = close - math.min(low, close[1]) - (typeCM == 'Pressure' ? 0 : lw)          //buying_pressure
sp = math.max(high, close[1]) - close - (typeCM == 'Pressure' ? 0 : hw)         //selling_pressure
//}
// Averaging Components {
gaus(source, length) =>
    pi = math.pi
    beta = (1 - math.cos(2 * pi / length)) / (math.pow(2, 0.1) - 1)
    alpha = -beta + math.sqrt(math.pow(beta, 2) + 2 * beta)

    var float filter = na
    filter := math.pow(alpha, 10) * source +
         10 * (1 - alpha) * nz(filter[1]) -
         45 * math.pow(1 - alpha, 2) * nz(filter[2]) +
         120 * math.pow(1 - alpha, 3) * nz(filter[3]) -
         210 * math.pow(1 - alpha, 4) * nz(filter[4]) +
         252 * math.pow(1 - alpha, 5) * nz(filter[5]) -
         210 * math.pow(1 - alpha, 6) * nz(filter[6]) +
         120 * math.pow(1 - alpha, 7) * nz(filter[7]) -
         45 * math.pow(1 - alpha, 8) * nz(filter[8]) +
         10 * math.pow(1 - alpha, 9) * nz(filter[9]) -
         math.pow(1 - alpha, 10) * nz(filter[10])

    // Phase compensation (simple forward shift by half filter length)
    fShift = (filter + nz(filter[1])) / 2
    fShift
ma(source, length, type) =>
    switch type
        'Gaussian 10 Polar' => gaus(source, length)
        'Linear Regression' => ta.linreg(source, length, 0)
        'SMA' => ta.sma(source, length)
        'EMA' => ta.ema(source, length)
        'HMA' => ta.hma(source, length)
        'RMA' => ta.rma(source, length)
        'WMA' => ta.wma(source, length)
atr = trsw ? ma(tr, ln, typeMA) : na
brma = brsw ? ma(br, ln, typeMA) : na
bpma = ma(bp, ln, typeMA)
spma = ma(sp, ln, typeMA)
awma = awsw ? ma(aw, ln, typeMA) : na
lwma = wksw ? ma(lw, ln, typeMA) : na
hwma = wksw ? ma(hw, ln, typeMA) : na
twma = twsw ? ma(tw, ln, typeMA) : na
//}
// Derived components {
bsmx = math.max(bpma, spma)
bsmax = ta.highest(bsmx, ln * 3)
//}
// Colors {
color bpgrow = color.rgb(0, 206, 0)
color bpfall = color.rgb(155, 0, 255)
color spgrow = color.rgb(255, 0, 0)
color spfall = color.rgb(245, 127, 33)
//}
// Plots & Fills {
trp = plot(atr, 'ATR', color = #000000, linewidth = 2, trackprice = false)
brmap = plot(brma, 'Average Body Range', color = #000000, linewidth = 1, style = plot.style_stepline, display = display.all)
awmap = plot(awma, 'Awerage Wick', color = #000000, linewidth = 2, style = plot.style_line, display = display.all)
hwp = plot(hwma, 'Higher Wick', color = #2a2e39, linewidth = 1, trackprice = false, style = plot.style_circles)
lwp = plot(lwma, 'Lower Wick', color = #2a2e39, linewidth = 1, trackprice = false, style = plot.style_cross)
twmap = plot(twma, 'Total Wicks', color = #787b86, style = plot.style_stepline, display = display.all)
bpp = plot(bpma, 'Buying Pressure', color = bpma > bpma[1] ? bpgrow : bpfall, linewidth = 2)
spp = plot(spma, 'Selling Pressure', color = spma > spma[1] ? spgrow : spfall, linewidth = 2)
fill(trp, awmap, color.new(#ffffff, 90), 'ATR AWR ZONE', editable = true)
fill(lwp, hwp, color.new(#2a2e39, 40), 'LH Wicks ZONE', editable = true)
fill(bpp, spp, math.avg(bpma, spma), bsmax, na, color.rgb(0, 0, 0, 25), "High Shades")
barcolor(bg and bpma < bpma[1] and close > close[1] ? color.new(bpfall, 0) : na, 0)
barcolor(bg and spma < spma[1] and close < close[1] ? color.new(spfall, 0) : na, 0)
//}